#!/usr/bin/env python
# -*- coding: utf-8 -*-

from collections import Iterable
#Iterable(可迭代对象)不具备next()方法
#把list、dict、str等Iterable(可迭代对象)变成Iterator（迭代器）可以使用iter()函数：
print(isinstance([], Iterable))
print(isinstance({}, Iterable))
print(isinstance('abc', Iterable))
print(isinstance((x for x in range(10)), Iterable))


# 迭代器
#
# 我们已经知道，可以直接作用于for循环的数据类型有以下几种：
#
# 一类是集合数据类型，如list、tuple、dict、set、str等；
#
# 一类是generator，包括生成器和带yield的generator function。
#
# 这些可以直接作用于for循环的对象统称为可迭代对象：Iterable。
#
# 可以使用isinstance()判断一个对象是否是Iterable对象：


#生成器就是迭代器 迭代器不一定是生成器
#list tuple dict string ：iterabel（可迭代对象） 它们内部都有__iterator__

L = [1,2,3,4,5]
d=iter(L) #1,__iter__()
print(d)#<list_iterator object at 0x0000000000A68AC8>

# 什么是迭代器
#满足两个条件：1，有iter方法  2，有next方法
#而生成器不但可以作用于for循环，还可以被next()函数不断调用并返回下一个值，直到最后抛出StopIteration错误表示无法继续返回下一个值了

print(next(d))# return 1
print(next(d))# return 2
print(next(d))# return 3
print(next(d))# return 4
print(next(d))# return 5
print(next(d))# 抛出StopIteration错误表示无法继续返回下一个值了

#for 循环内部三件事
    #1，调用可迭代对象的iter方法，返回一个迭代对象
    #2，不断调用迭代器对象的next方法
    #3，处理StopIteration 异常
# for i in [1,2,3]:
#     iter([1,2,3])